<?php
namespace spider;

use GuzzleHttp\Client;

/**
 * Class GHttp
 * @package Jaeger
 *
 * @method static string get($url,$args = null,$otherArgs = [])
 * @method static mixed  getJson($url, $args = null, $otherArgs = [])
 * @method static string post($url,$args = null,$otherArgs = [])
 * @method static string postRaw($url, $raw = null, $otherArgs = [])
 * @method static string postJson($url, $args = null, $otherArgs = [])
 */
class GHttp
{
    private static $client = null;

    public static function __callStatic($name, $arguments)
    {
        $protectedName = '_'.$name;
        if(method_exists(self::class,$protectedName)){
            return Cache::remember($protectedName, $arguments);
        }
        throw new MethodNotFoundException('Call undefined method '.self::class.':'.$name.'()');
    }

    public static function getClient(array $config = [])
    {
        if(self::$client == null){
            self::$client = new Client($config);
        }
        return self::$client;
    }

    /**
     * @param $url
     * @param array $args
     * @param array $otherArgs
     * @return string
     */
    protected static function _get($url,$args = null,$otherArgs = [])
    {
        is_string($args) && parse_str($args,$args);
        $args = array_merge([
            'verify' => false,
            'query' => $args,
            'headers' => [
                'referer' => $url,
                'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
            ]
        ],$otherArgs);
        $client = self::getClient();
        $response = $client->request('GET', $url,$args);
        return (string)$response->getBody();
    }

    protected static function _getJson($url, $args = null, $otherArgs = [])
    {
        $data = self::get($url, $args , $otherArgs);
        return json_decode($data,JSON_UNESCAPED_UNICODE);
    }

    /**
     * @param $url
     * @param array $args
     * @param array $otherArgs
     * @return string
     */
    protected static function _post($url,$args = null,$otherArgs = [])
    {
        is_string($args) && parse_str($args,$args);
        $args = array_merge([
            'verify' => false,
            'form_params' => $args,
            'headers' => [
                'referer' => $url,
                'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
            ]
        ],$otherArgs);
        $client = self::getClient();
        $response = $client->request('Post', $url,$args);
        return (string)$response->getBody();
    }

    /**
     * @param $url
     * @param null $raw
     * @param array $otherArgs
     * @return string
     */
    protected static function _postRaw($url, $raw = null, $otherArgs = [])
    {
        is_array($raw) && $raw = json_encode($raw);
        $args = array_merge([
            'verify' => false,
            'body' => $raw,
            'headers' => [
                'referer' => $url,
                'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
            ]
        ],$otherArgs);
        $client = self::getClient();
        $response = $client->request('Post', $url,$args);
        return (string)$response->getBody();
    }

    /**
     * @param $url
     * @param null $args
     * @param array $otherArgs
     * @return string
     */
    protected static function _postJson($url, $args = null, $otherArgs = [])
    {
        is_string($args) && parse_str($args,$args);
        $args = array_merge([
            'verify' => false,
            'json' => $args,
            'headers' => [
                'referer' => $url,
                'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
            ]
        ],$otherArgs);
        $client = self::getClient();
        $response = $client->request('Post', $url,$args);
        return (string)$response->getBody();
    }

    /**
     * @param $url
     * @param $filePath
     * @param null $args
     * @param array $otherArgs
     * @return string
     */
    public static function download($url,$filePath,$args = null,$otherArgs = [])
    {
        $otherArgs = array_merge($otherArgs,[
            'sink' => $filePath,
        ]);
        return self::get($url,$args,$otherArgs);
    }

    /**
     * @param $urls
     * @return MultiRequest
     */
    public static function multiRequest($urls)
    {
        $client = self::getClient();
        return MultiRequest::newRequest($client)->urls($urls);
    }
}